package com.geostar.constructionland.attachment.entity;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import javax.ws.rs.core.Response;

import com.geostar.constructionland.attachment.config.StaticValue;
import com.geostar.constructionland.attachment.util.FileCharsetDetector;
import com.geostar.constructionland.attachment.util.GetContentUtils;
import com.geostar.constructionland.attachment.util.PdfHandler;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.jaxrs.client.WebClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 附件
 */
@Component("textExtractor")
public class TextExtractor {

  //OCR文本提取服务地址(tika server)
  @Value("${ocrservice.endPoint}")
  private String endPoint;
  //OCR tikaPath(tika路径)
  @Value("${ocrservice.tikaPath}")
  private String tikaPath;
  //pdf文件上传时进行ocr识别的开始页码
  @Value("${ocrservice.pdf.startPage}")
  private int startPage;
  //pdf文件上传时进行ocr识别的结束页码
  @Value("${ocrservice.pdf.endPage}")
  private int endPage;

  /**
   * 普通内容提取
   * <功能详细描述>
   * 目前Office文件、文本文件、pdf文件支持普通提取
   *
   * @return String [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @author Jimmy
   * 创建时间:  2017年9月14日
   * @see [类、类#方法、类#成员]
   */
  public String ordinaryExtract(String filePath) {
    String text = "";
    if (isOfficeFile(filePath)) {
//      FileTypeConverter formatConverter = new FileTypeConverter();
      String pdfFilePath = FilenameUtils.removeExtension(filePath) + ".pdf";
      //暂时注释2018-10-8 19:02:31
//            File pdfFile = formatConverter.office2pdf(filePath, pdfFilePath);
      try {
        //暂时注释2018-10-8 19:02:31
//                text = new GetContentUtils().getPdf(pdfFilePath);
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        //暂时注释2018-10-8 19:02:31
//                FileUtils.deleteQuietly(pdfFile);
      }
    } else if (isImageFile(filePath)) {
    } else if (isPdfFile(filePath)) {
      try {
        text = new GetContentUtils().getPdf(filePath);
      } catch (Exception e) {
        e.printStackTrace();
      }
    } else if (isTextFile(filePath)) {
      try {
        File f = new File(filePath);
        String encoding = FileCharsetDetector.detect(filePath);
        text = FileUtils.readFileToString(f, encoding);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return text;
  }

  /**
   * OCR内容提取<br/>
   * 仅上传文件到OCR服务 无返回<br/>
   * 目前图片文件、pdf文件支持OCR提取
   *
   * @return [参数说明]
   * @throws throws [违例类型] [违例说明]
   * @author Jimmy
   * 创建时间:  2017年9月14日
   * @see [类、类#方法、类#成员]
   */
  public String ocrExtract(String filePath) throws Exception {
    String result = null;
    if (isImageFile(filePath) || isPdfFile(filePath)) {
      if (isImageFile(filePath)) {
        try {
          result = callOCRService(filePath);
        } catch (IOException e) {
          throw e;
        }
      }
      //根据startPage和endPage拆分出一部分的pdf进行OCR识别
      else if (isPdfFile(filePath)) {
        File partFile = null;
        try {
          partFile = PdfHandler.getOnePart(new File(filePath), startPage, endPage);
          result = callOCRService(partFile.getAbsolutePath());
        } catch (IOException e) {
          throw e;
        } finally {
          FileUtils.deleteQuietly(partFile);
        }
      }
    }
    return result;
  }

  /**
   * 判断是否是Office文件
   * <功能详细描述>
   *
   * @return boolean [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  public static boolean isOfficeFile(String filePath) {
    String fileExtension = FilenameUtils.getExtension(filePath).toLowerCase();
    if (StringUtils.isNotBlank(fileExtension) && StaticValue.OFFICE_FILE.contains("." + fileExtension)) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 判断是否是Excel文件
   * <功能详细描述>
   *
   * @return boolean [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  public static boolean isExcelFile(String filePath) {
    String fileExtension = FilenameUtils.getExtension(filePath).toLowerCase();
    if (StringUtils.isNotBlank(fileExtension) && StaticValue.EXCEL_FILE.contains("." + fileExtension)) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 判断是否是Word文件
   * <功能详细描述>
   *
   * @return boolean [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  public static boolean isWordFile(String filePath) {
    String fileExtension = FilenameUtils.getExtension(filePath).toLowerCase();
    if (StringUtils.isNotBlank(fileExtension) && StaticValue.WORD_FILE.contains("." + fileExtension)) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 判断是否是图片文件
   * <功能详细描述>
   *
   * @return boolean [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  public static boolean isImageFile(String filePath) {
    String fileExtension = FilenameUtils.getExtension(filePath).toLowerCase();
    if (StringUtils.isNotBlank(fileExtension) && StaticValue.IMG_FILE.contains("." + fileExtension)) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 判断是否是文本文件
   * <功能详细描述>
   *
   * @return boolean [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  public static boolean isTextFile(String filePath) {
    String fileExtension = FilenameUtils.getExtension(filePath).toLowerCase();
    if (StringUtils.isNotBlank(fileExtension) && StaticValue.TEXT_FILE.contains("." + fileExtension)) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 判断是否是pdf文件
   * <功能详细描述>
   *
   * @return boolean [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  public static boolean isPdfFile(String filePath) {
    String fileExtension = FilenameUtils.getExtension(filePath).toLowerCase();
    if (StringUtils.isNotBlank(fileExtension) && StaticValue.PDF_FILE.contains("." + fileExtension)) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 判断文件是否支持预览
   * <功能详细描述>
   *
   * @return boolean [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  public static boolean isPreviewSupportedFile(String filePath) {
    if (isOfficeFile(filePath) || isImageFile(filePath) || isTextFile(filePath) || isPdfFile(filePath)) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * 调用OCR文字识别服务</br>
   * OCR文字识别服务已经独立成为单独的应用并且以队列的方式运行</br>
   * 所以此方法仅仅是上传文件到OCR服务加入队列等候处理 返回值不包含文字识别到的内容
   *
   * @return String [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  private String callOCRService(String filePath) throws IOException {
    FileInputStream fileInputStream = null;
    String responseMsg = null;
    try {
      fileInputStream = FileUtils.openInputStream(new File(filePath));
      Response response = WebClient.create(endPoint).path(tikaPath)
          .accept("text/plain")
          .header("X-Tika-PDFextractInlineImages", "true")
          .header("X-Tika-OCRLanguage", "eng+chi_sim")
          .put(fileInputStream);
      responseMsg = IOUtils.toString((InputStream) response.getEntity(), StandardCharsets.UTF_8);
    } catch (IOException e) {
      throw e;
    } finally {
      IOUtils.closeQuietly(fileInputStream);
    }
    return responseMsg;
  }

  public static void main(String[] args) throws IOException, InterruptedException {
//        TextExtractor textExtractor = new TextExtractor();
////        textExtractor.setOcrServiceUrl("http://192.168.100.157:8004/OCRService/mvc/ocr/ocrExtract");
//        textExtractor.setOcrServiceUrl("http://localhost:8001/OCRService/mvc/ocr/ocrExtract");
//        String[] filesFullName = {
//                "C:\\Users\\Jimmy\\Desktop\\18logs\\0417\\01.2018-04-17 154214,257 图.pdf",
//                "C:\\Users\\Jimmy\\Desktop\\18logs\\0417\\02.2018-04-17 154214,322.pdf",
//                "C:\\Users\\Jimmy\\Desktop\\18logs\\0417\\03.2018-04-17 154214,423.pdf",
//                "C:\\Users\\Jimmy\\Desktop\\18logs\\0417\\04.2018-04-17 154215,239.pdf",
//                "C:\\Users\\Jimmy\\Desktop\\18logs\\0417\\05.2018-04-17 154255,539 图.pdf"
//                };
//        int x = 1;
//        for (int j = 0; j < 10; j++) {
//            for (int i = 0; i < filesFullName.length; i++) {
//                String fileFullName = filesFullName[i];
//                String result = textExtractor.callOCRService(null, fileFullName);
//                System.out.println(x);
//                x++;
//            }
//        }

    System.out.println(isWordFile(".doc"));

  }

}